﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using CapaLogica.CL.Carrera;
using CapaLogica.CL.UtilidadesGenerales;
using AccesoBD;
using CapaLogica.CL.Usuario;

namespace CapaLogica
{
    public class GestorCurso
    { 
        /// <summary>
        /// Método de la clase encargada de insertar un nuevo Curso a la DB 
        /// </summary>
        /// <param name="pcodigoCurso">Codigo del Curso, tipo String</param>
        /// <param name="pnombre">Nombre del Curso, tipo String</param>
        /// <param name="pdescripcion">Descripcion de curso, tipo String</param>
        /// <param name="pestado">Estado del curso, tipo Boolean</param>
        /// <remarks></remarks>
        public static void registrarCurso(string pcodigoCurso, string pnombre, string pdescripcion, List<int> pcarreras) {
            try
            {
                CursoPersistente _cursoPersist = new CursoPersistente();
                Boolean estado = true;
                Cl_Curso objCurso = new Cl_Curso(pcodigoCurso, pnombre, pdescripcion, estado);
                _cursoPersist.registrarCursoPersistente(objCurso, pcarreras, Session.Id);
            }
            catch (Exception ex )
            {
                
                throw ex;
            }
            
            
        }


        /// <summary>
        /// Método de la clase encargada de insertar un cursos de forma masiva
        /// </summary>
        /// <remarks></remarks>
        public static bool registrarCursoBatch(List<List<string>> pDatosCursos)
        {
            bool result=true;

            try{
                List<Cl_Curso> listaCurso = new List<Cl_Curso>();
                List<int> pcarreras=new List<int> ();

                for (int i = 0; i < pDatosCursos.Count; i++) {
                    List<string> Datos=pDatosCursos[i];
                    Cl_Curso objCurso = new Cl_Curso(Datos[0], Datos[1], Datos[2], true);
                    pcarreras.Add(Convert.ToInt32(Datos[3]));
                    listaCurso.Add(objCurso);
                }

                CursoPersistente _cursoPersist = new CursoPersistente();
                _cursoPersist.registrarCursoPersistenteBacth(listaCurso, pcarreras);
            }catch (Exception ex){
                result=false;
            }

            return result;
        }

        /// <summary>
        /// Método encargado de buscar un curso por un criterio
        /// </summary>
        /// <param name="psemanaHorario"></param>
        /// <param name="psemanaHorario"></param>
        /// <returns>
        /// Colección de Array
        /// </returns> qq
        /// <remarks></remarks>
        public static List<Cl_Curso> buscarCurso(String pcriterio, int ptipoCriterio)
        {
            CursoPersistente _cursoPersist = new CursoPersistente(); 
            List<Cl_Curso> _cursos = new List<Cl_Curso>();
      
            if (ptipoCriterio == 1)
            {
                _cursos = _cursoPersist.buscarCursoPorCodigo(pcriterio);
            }
            else
            {
                _cursos = _cursoPersist.buscarCursoPorNombre(pcriterio);
            }

            return _cursos;
        }

        /// <summary>
        /// Método encargado de buscar un curso por un criterio
        /// </summary>
        /// <param name="psemanaHorario"></param>
        /// <param name="psemanaHorario"></param>
        /// <returns>
        /// Colección de Array
        /// </returns> qq
        /// <remarks></remarks>
        public static List<Cl_Curso> consultarCurso(String pcriterio)
        {
            CursoPersistente _cursoPersist = new CursoPersistente();
            List<Cl_Curso> _cursos = new List<Cl_Curso>();
            List<Array> _arreglo = new List<Array>();

             _cursos = _cursoPersist.buscarCursoPorCodigo(pcriterio);
            
            return _cursos;
        }

        /// <summary>
        /// Método encargado de buscar un curso 
        /// </summary>
        /// <param name="psemanaHorario"></param>
        /// <param name="psemanaHorario"></param>
        /// <returns>
        /// Colección de Array
        /// </returns> qq
        /// <remarks></remarks>
            public static List<Cl_Curso> buscarTodosCursos()
        {
            CursoPersistente _persistenteCurso = new CursoPersistente();
            List<Cl_Curso> _temas = new List<Cl_Curso>();

            try
            {
                _temas = _persistenteCurso.buscarTodosCursos();

            }
            catch (Exception)
            {

            }
            return _temas;
        }


            public static List<Informacion> listarTodosLosCursos()
            {

                try
                {
                    CursoPersistente persitente = new CursoPersistente();
                    List<EsCurso> listTemp = persitente.listarLosCursos();
                    List<Informacion> datosCursos = new List<Informacion>();

                    foreach (EsCurso temp in listTemp)
                    {
                        datosCursos.Add(temp);
                    }

                    return datosCursos;
                }
                catch (Exception)
                {

                    throw;
                }
            }


        /// <summary>
        /// Método de la clase encargada de modificar un nuevo Curso a la DB 
        /// </summary>
        /// <param name="pcodigoCurso">Codigo del Curso, tipo String</param>
        /// <param name="pnombre">Nombre del Curso, tipo String</param>
        /// <param name="pdescripcion">Descripcion de curso, tipo String</param>
        /// <param name="pestado">Estado del curso, tipo Boolean</param>
        /// <remarks></remarks>
        public static void modificarCurso(string pcodigoCurso, string pnombre, string pdescripcion, int pid ,List<int> listaCarreraA)
        {
            try
            {
                int idUsuario = Session.Id;
                //int idUsuario = 142;
                CursoPersistente _cursoPersist = new CursoPersistente();
                CarreraPersistente _carreraPersist = new CarreraPersistente();
                Cl_Curso objCurso = new Cl_Curso(pcodigoCurso, pnombre, pdescripcion);
                List<int> idsBD = _carreraPersist.buscarIdsCarrerasDeCurso(pid);
                _cursoPersist.actualizarCursos(objCurso, listaCarreraA, idsBD,pid,idUsuario);
            }
            catch (Exception ex)
            {
                throw ex;
            } 
        }

        /// <summary>
        /// Método de la clase encargada de eliminar un nuevo Curso a la DB 
        /// </summary>
        /// <param name="pcodigoCurso">Codigo del Curso, tipo String</param>
        /// <remarks></remarks>
        public static  void eliminarCurso(String pcodigo)
        {

            try
            {
                CursoPersistente _cursoPersist = new CursoPersistente();
                _cursoPersist.eliminarCurso(pcodigo, Session.Id);
            }
            catch (Exception ex)
            {
                
                throw ex;
            }

            
        }

        /// <summary>
        /// Método de la clase encargada de buscar los cursos de una carrera por su id
        /// </summary>
        /// <param name="pIdCarrera">Id de la carrera, tipo int</param>
        /// <remarks></remarks>
        public static List<Informacion> listarCursosDeCarrera(int pIdCarrera)
        {
            try
            {
                CursoPersistente persistente = new CursoPersistente();
                List<Cl_Curso> cursos = persistente.buscarCursosDeCarrera(pIdCarrera);
                List<Informacion> datosCursos = new List<Informacion>();

                if(cursos.Count ==0){
                    throw new Exception("No hay cursos registrados para esa carrera.");
                }

                foreach  (Cl_Curso temp in cursos)
                {
                    EsCurso curso = new EsCurso(temp.id+"", temp.codigoCurso, temp.nombre);
                    datosCursos.Add(curso);
                }

                return datosCursos;
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }



        /// <summary>
        /// Método de la clase que buscar todas las carreras del sistema asociadas a un curso.
        /// </summary>
        /// <remarks></remarks>
        public static List<Informacion> buscarCursosAsociadosCarrera(int pidCarrera)
        {

            try
            {
                CursoPersistente persitente = new CursoPersistente();
                List<EsCurso> listTemp = persitente.buscarCursosAsociadosCarrera(pidCarrera);
                List<Informacion> datosCursos = new List<Informacion>();

                foreach (EsCurso temp in listTemp)
                {
                    datosCursos.Add(temp);
                }

                return datosCursos;
            }
            catch (Exception)
            {

                throw;
            }

        }
     
    }
}

